package pimmodel;

import pimgui.PimGui;

/**
 * 
 * Klasse Telefonnr:<br>
 * Wird fuer die Klasse Kontakt benoetigt, <br>
 * da die Telefonnummern durch eine Liste verwaltet werden.
 *
 * @authors (Torsten Mansfeld, Thomas Schoenfeld)
 * @version (20120901_02)
 * 
 */
public class Telefonnr implements ITelefonnr {

	// Serialisierungs-UID
	private static	final	long	serialVersionUID	= 1L;
	
	
	
	// Meldungskonstanten
	private	static	final	String	TELEFONTYP			= "Der uebergebene Telefontyp ist kein gueltiger String.";
	private	static	final	String	TELEFONNR			= "Die uebergebene Telefonnr ist kein gueltiger String.";	
	private	static	final	String	OBJEKTTYP			= "Das uebergebene Objekt ist nicht vom Typ ITelefonnr.";
	
	
	
	// Instanzvariablen
	private					String	telefontyp;
	private					String	telefonnr;
	


	// Konstruktoren
	
	/**
	 *  Standardkonstruktor der Klasse Telefonnr.
	 */
	public Telefonnr() {
		
		this.telefontyp = "Festnetz";
		this.telefonnr	= "112";
		
	}
	
	/**
	 * Konstruktor der Klasse Telefonnr.
	 * 
	 * @param	telefontyp	der Telefontyp, z.B. Festnetz1, Festnetz2, Mobil1, Mobil2, Fax1, ...
	 * @param	telefonnr	die Telefonnummer
	 * 
	 * @throws	IllegalArgumentException falls keine gueltigen Strings uebergeben wurden
	 */
	public Telefonnr( final String telefontyp, final String telefonnr ) {
		
		setTelefontyp( telefontyp );
		setTelefonnr( telefonnr );
		
	}
	
	/**
	 * Kopierkonstruktor der Klasse Telefonnr.
	 * 
	 * @param	telnr		der zu kopierende Telefoneintrag
	 * 
	 * @throws	IllegalArgumentException falls kein gueltiges Objekt vom Typ ITelefonnr uebergeben wurde
	 */
	public Telefonnr( final ITelefonnr telnr ) {
		
		if ( !( telnr instanceof Telefonnr ) )
			throw new IllegalArgumentException( OBJEKTTYP );
		
		setTelefontyp( telnr.getTelefontyp() );
		setTelefonnr( telnr.getTelefonnr() );
		
	}
	
	

	// Getter und Setter Methoden
	
	/* (non-Javadoc)
	 * @see pimmodel.ITelefonnr#getTelefontyp()
	 */
	@Override
	public String getTelefontyp() {
		
		return this.telefontyp;
		
	}

	/* (non-Javadoc)
	 * @see pimmodel.ITelefonnr#setTelefontyp(java.lang.String)
	 */
	@Override
	public void setTelefontyp( final String telefontyp ) {
		
		if ( !( telefontyp instanceof String ) || telefontyp.trim().isEmpty() )
			throw new IllegalArgumentException( TELEFONTYP );
		
		this.telefontyp = telefontyp.trim();
		
	}		
	
	/* (non-Javadoc)
	 * @see pimmodel.ITelefonnr#getTelefonnr()
	 */
	@Override
	public String getTelefonnr() {
		
		return this.telefonnr;
		
	}	

	/* (non-Javadoc)
	 * @see pimmodel.ITelefonnr#setTelefonnr(java.lang.String)
	 */
	@Override
	public void setTelefonnr( final String telefonnr ) {
		
		if ( !( telefonnr instanceof String ) || telefonnr.trim().isEmpty() )
			throw new IllegalArgumentException( TELEFONNR );
		
		this.telefonnr = telefonnr.trim();
		
	}



	// zu ueberschreibende Standard Methoden

	/* (non-Javadoc)
	 * @see pimmodel.ITelefonnr#toString()
	 */
	@Override
	public String toString() {
		
		return PimGui.getResourceBundle().getString("telty")+"   " + telefontyp+" ; " + PimGui.getResourceBundle().getString("telnr") + telefonnr;
		
	}
	
	/* (non-Javadoc)
	 * @see pimmodel.ITelefonnr#hashCode()
	 */
	@Override
	public int hashCode() {
		
		int result = 17;
		
		result = 31 * result + this.getTelefontyp().hashCode();
		result = 31 * result + this.getTelefonnr().hashCode();
		
		return result;
		
	}
	
	/* (non-Javadoc)
	 * @see pimmodel.ITelefonnr#equals(java.lang.Object)
	 */
	@Override
	public boolean equals( final Object objekt ) {
		
		if ( this == objekt )
			return true;
		
		if ( !( objekt instanceof Telefonnr ) )
			return false;
		
		ITelefonnr eintrag = ( ITelefonnr ) objekt;
		
		return	(	this.telefontyp.equals( eintrag.getTelefontyp() )
				&&	this.telefonnr.equals( eintrag.getTelefonnr() )
				&&	this.hashCode() == eintrag.hashCode()
				);
		
	}	
	
	/**
	 * clone				erzeugt und liefert tiefe Kopie dieses Objekts
	 * 
	 * @return				tiefe Kopie des Objekts
	 */
	@Override
	public ITelefonnr clone() {
				
		return new Telefonnr( this.telefontyp, this.telefonnr );
		
	}
	
	// compareTo, falls Comparable implementiert werden soll
	
	/**
	 * compareTo			vergleicht den Telefoneintrag mit dem uebergebenen Telefoneintrag
	 * 
	 * @param	telnr		der mit diesem Telefoneintrag zu vergleichende Telefoneintrag
	 * 
	 * @return				-1, falls a) der Typ und b) die Telefonnummer dieses Eintrags lexikographisch kleiner,<br>
	 * 						 1, falls er groesser bzw.<br>
	 * 						 0, falls er gleich dem uebergebenen Eintrag ist
	 * 
	 * @throws	IllegalArgumentException falls kein gueltiges Objekt vom Typ ITelefonnr uebergeben wurde
	 */
	@Override
	public int compareTo( ITelefonnr telnr ) {
		
		if ( !( telnr instanceof ITelefonnr ) )
			throw new IllegalArgumentException(OBJEKTTYP);		
		
		if ( this.telefontyp.compareTo( telnr.getTelefontyp() ) < 0 )		
			return -1;
		if ( this.telefontyp.compareTo( telnr.getTelefontyp() ) > 0 )		
			return 1;
		if ( this.telefonnr.compareTo( telnr.getTelefonnr() ) < 0 )		
			return -1;
		if ( this.telefonnr.compareTo( telnr.getTelefonnr() ) > 0 )		
			return 1;
		
		return 0;
		
	}
	
}
